package cn.liangxxhu.idempotent.annotation;

import cn.liangxxhu.idempotent.enums.IdempotentSceneEnum;
import cn.liangxxhu.idempotent.enums.IdempotentTypeEnum;

import java.lang.annotation.*;

/**
 * 幂等性注解。
 * 支持多种幂等类型与使用场景，可结合切面在方法级别进行幂等控制。
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Idempotent {

    /**
     * 幂等 Key 表达式，仅当 {@link #type()} 为 {@link IdempotentTypeEnum#SPEL} 时生效。
     */
    String key() default "";

    /**
     * 触发幂等失败逻辑时，返回的错误提示信息
     */
    String message() default "您操作太快，请稍后再试";

    /**
     * 幂等验证类型：PARAM/TOKEN/SPEL 等。
     * 建议 REST 接口优先使用 {@link IdempotentTypeEnum#TOKEN} 或 {@link IdempotentTypeEnum#PARAM}。
     */
    IdempotentTypeEnum type() default IdempotentTypeEnum.PARAM;
    /**
     * 验证幂等场景，支持多种 {@link IdempotentSceneEnum}
     */
    IdempotentSceneEnum scene() default IdempotentSceneEnum.RESTAPI;

    /**
     * 防重令牌 Key 前缀（MQ 幂等去重可选）。
     * 仅当 {@link IdempotentSceneEnum#MQ} 且 {@link IdempotentTypeEnum#SPEL} 时生效。
     */
    String uniqueKeyPrefix() default "";

    /**
     * 防重令牌 Key 过期时间（秒），默认 3600（1 小时），MQ 幂等去重可选。
     * 仅当 {@link IdempotentSceneEnum#MQ} 且 {@link IdempotentTypeEnum#SPEL} 时生效。
     */
    long keyTimeout() default 3600L;


}
